package com.wuxuan.javabase_homework.homework2;

/**
 * 面向对象拓展
 * 用面向对象的思路完成对简易学生管理系统的设计
 * 简易学生管理系统
 * 请使用Java语言开发一个简易学生成绩管理系统，具体要求如下：
 * 1. 数据类型与变量：系统需记录学生的姓名（字符串类型）、年龄（整型）、数学成绩和语文成绩（双精度浮点型）。在程序开始时，使用合适的数据类型声明并初始化至少三名学生的信息。
 * 2. 运算符运用：计算每位学生的总成绩（数学成绩与语文成绩之和），以及平均成绩。在控制台输出每位学生的姓名、年龄、数学成绩、语文成绩、总成绩和平均成绩。平均成绩保留两位小数，总成绩为双精度浮点型。
 * 3. 流程控制：
 * - 选择结构：依据学生的平均成绩划分等级。平均成绩90分及以上为“A”，80 - 89分为“B”，70 - 79分为“C”，60 - 69分为“D”，60分以下为“F” 。在控制台输出每位学生的成绩等级。
 * - 循环结构：使用for循环遍历学生信息数组，对每位学生执行上述计算和等级评定操作。
 * 4. 数组应用：使用数组存储所有学生的信息，便于批量操作和管理。在程序中展示如何通过索引访问和修改数组中的学生信息。例如，修改其中一位学生的数学成绩，并重新计算其总成绩和平均成绩，输出更新后的信息。
 */
public class Homework2 {

    //创建一个数组存储所有学生
    public static Student[] students = new Student[3];

    public static void main(String[] args) {
        //1.初始化基本数据
        Student s1 = new Student("wuxuan", 18, 11.1, 20.8);
        Student s2 = new Student("wushuang", 19, 70.2, 80.8);
        Student s3 = new Student("jueying", 20, 99.9, 90.6);
        students[0] = s1;
        students[1] = s2;
        students[2] = s3;

        //2.输出学生基本信息
        System.out.println("-------------------------输出学生基本信息-----------------------");
        setAllStudentsInfo();
        travelStudents();

        //3.根据平均成绩划分等级(在setTotalScoresAndAverageScoresAndLevels()方法中已经完成等级设置)
        System.out.println("-------------------------------输出学生等级--------------------------------");
        //遍历等级数组，打印输出
        for (int i = 0; i < students.length; i++) {
            System.out.println(students[i].getName() + "的成绩等级：" + students[i].getLevel());
        }

        //4.修改wuxuan的语文成绩，从11。1改为99.9
        System.out.println("------------------------修改学生成绩-----------------------------");
        //根据学生姓名获取其索引(这里采用自定义方法写写)
        int index = getIndexByName("wuxuan");
        if (index == -1) {
            System.out.println("该学生不存在！");
            return;
        }
        //该学生存在
        //重新设置当前学生的信息
        setStudentInfo(index);
        System.out.println("当前学生序号：" + (index + 1));
        //根据索引计算并修改对应位置的信息
        students[index].setChineseScore(99.9);
        setStudentInfo(index);
        //输出更新后的信息
        System.out.println("当前学生信息更新后如下：");
        travelStudentInfo(index);

    }

    /**
     * 根据学生姓名获取其索引
     *
     * @param name 学生姓名
     * @return 学生索引
     */
    private static int getIndexByName(String name) {
        for (int i = 0; i < students.length; i++) {
            if (students[i].getName().equals(name)) {
                return i;
            }
        }
        return -1;
    }

    /**
     * 根据学生索引输出某个学生基本信息
     *
     * @param i 学生索引
     */
    private static void travelStudentInfo(int i) {
        System.out.println(students[i]);
    }

    /**
     * 遍历所有学生的基本信息
     */
    private static void travelStudents() {
        for (Student student : students) {
            System.out.println(student);
        }
    }

    /**
     * 根据学生索引计算并设置某个学生的平均成绩，总成绩，成绩等级
     */
    private static void setStudentInfo(int i) {
        //计算平均成绩及总成绩并存入数组中
        double averageScore = averageScore(students[i].getChineseScore(), students[i].getMathScore());
        double totalScore = totalScore(students[i].getChineseScore(), students[i].getMathScore());
        students[i].setAverageScore(averageScore);
        students[i].setTotalScore(totalScore);
        setStudnetLevel(i);
    }

    /**
     * 计算并设置所有学生的平均成绩，总成绩，成绩等级
     */
    private static void setAllStudentsInfo() {
        for (int i = 0; i < students.length; i++) {
            //计算平均成绩及总成绩并存入数组中
            double averageScore = averageScore(students[i].getChineseScore(), students[i].getMathScore());
            double totalScore = totalScore(students[i].getChineseScore(), students[i].getMathScore());
            students[i].setAverageScore(averageScore);
            students[i].setTotalScore(totalScore);
        }
        setAllStudentsLevels();
    }


    /**
     * 单独计算并设置某个学生的等级
     *
     * @param i 学生索引
     */
    private static void setStudnetLevel(int i) {
        if (students[i].getAverageScore() >= 90) {
            students[i].setLevel("A");
        } else if (students[i].getAverageScore() >= 80) {
            students[i].setLevel("B");
        } else if (students[i].getAverageScore() >= 70) {
            students[i].setLevel("C");
        } else if (students[i].getAverageScore() >= 60) {
            students[i].setLevel("D");
        } else if (students[i].getAverageScore() >= 0) {
            students[i].setLevel("F");
        } else {
            System.out.println("第" + (i + 1) + "位学生" + students[i].getName() + "的平均成绩" + students[i].getAverageScore() + "异常，请于系统中详细检查！！！");
        }
    }

    /**
     * 遍历每个学生的平均成绩，根据成绩的范围设置等级
     */
    private static void setAllStudentsLevels() {
        for (int i = 0; i < students.length; i++) {
            if (students[i].getAverageScore() >= 90) {
                students[i].setLevel("A");
            } else if (students[i].getAverageScore() >= 80) {
                students[i].setLevel("B");
            } else if (students[i].getAverageScore() >= 70) {
                students[i].setLevel("C");
            } else if (students[i].getAverageScore() >= 60) {
                students[i].setLevel("D");
            } else if (students[i].getAverageScore() >= 0) {
                students[i].setLevel("F");
            } else {
                System.out.println("第" + (i + 1) + "位学生" + students[i].getName() + "的平均成绩" + students[i].getAverageScore() + "异常，请于系统中详细检查！！！");
            }
        }
    }


    /**
     * 计算某个学生的总成绩(目前是语文成绩和数学成绩之和)
     *
     * @param chineseScore 语文成绩
     * @param mathScore    数学成绩
     * @return
     */
    private static double totalScore(double chineseScore, double mathScore) {
        return chineseScore + mathScore;
    }

    /**
     * 计算某个学生的平均成绩
     *
     * @param chineseScore
     * @param mathScore
     * @return
     */
    private static double averageScore(double chineseScore, double mathScore) {
        return (chineseScore + mathScore) / 2;
    }

}
